/*
 * Copyright 2013-2019 Xia Jun(3979434@qq.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ***************************************************************************************
 *                                                                                     *
 *                        Website : http://www.farsunset.com                           *
 *                                                                                     *
 ***************************************************************************************
 */
package com.workcell.workdata.im.service.impl;

import com.workcell.workdata.im.component.event.DeleteMessageEvent;
import com.workcell.workdata.im.component.event.RevokerMessageEvent;
import com.workcell.workdata.im.constant.MessageAction;
import com.workcell.workdata.im.constant.MessageState;
import com.workcell.workdata.im.entity.Message;
import com.workcell.workdata.im.repository.MessageRepositoryProxy;
import com.workcell.workdata.im.service.MessageService;
import com.workcell.workdata.im.service.MidGenerator;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Service
public class MessageServiceImpl implements MessageService {

	@Resource
	private MessageRepositoryProxy messageRepositoryProxy;

	@Resource
	private MidGenerator midGenerator;

	@Resource
	private ApplicationContext applicationContext;


	@Override
	@Transactional(rollbackFor = Exception.class)
	public void revoke(long uid,Long id,String action) {

		Message message = findOne(id,action);

		if (message == null){
			return;
		}

		messageRepositoryProxy.delete(message);

		applicationContext.publishEvent(new DeleteMessageEvent(message));

		applicationContext.publishEvent(new RevokerMessageEvent(uid,message));
	}

	@Override
	public void delete(Long id, String action) {
		Message message = findOne(id,action);
		if (message == null){
			return;
		}
		messageRepositoryProxy.delete(message);
		applicationContext.publishEvent(new DeleteMessageEvent(message));
	}

	@Override
	public void receive(Long id,String action) {
		if (MessageAction.ACTION_0.equals(action)){
			messageRepositoryProxy.receive(id);
		}
	}

	@Override
	public void read(Long id) {
		messageRepositoryProxy.read(id);
	}

	@Override
	public void read(List<Long> idList) {
		messageRepositoryProxy.read(idList);
	}


	@Override
	public Message findOne(Long id,String action) {
		return messageRepositoryProxy.findOne(id,action);
	}

	@Override
	public void save(Message message) {

		message.setId(midGenerator.nextId());

		if (message.getState() == null) {
			message.setState(MessageState.STATE_NOT_RECEIVED);
		}
		if (message.getCreateTime() == null){
			message.setCreateTime(new Date());
		}

		messageRepositoryProxy.save(message);
	}

}
